#include "widget.h"
#include "ui_widget.h"
#include <QLineEdit>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //坐标系的原点(0,0)就是屏幕的左上角／窗口的左上角给Qt的某个控件
    //设置位置，就需要指定坐标.对于这个控件来说，坐标系原点就是相对于父窗口/控件的
    //QWidget没有父元素（NULL)，就相当于父元素就是整个显示器桌面了
    this->move(100, 100);

    //通过图形化的界面来生成按钮
    //Qt中的信号槽机制.本质就是给按钮的点击操作，关联上一个处理函数，当用户点击的时候，就会执行这个处理函数
    //Linux网络编程中，也学过一个函数，叫做connect.这个函数用来给TCPsocket建立连接的.写TCP客户端的时候，就需要先建立连接，然后才能读写数据
    //Qt 中的connect是QObject这个类提供的静态函数.这个函数的作用就是“连接信号和槽"和TCP的建立连接操作没有任何关系

              //谁发出的信号      发出了什么信号                  具体怎么处理
    connect(ui->myPushButton, &QPushButton::clicked, this, &Widget::HandleClick1);
                                                     //谁来处理这个信号

    //通过代码的方式来生成按钮
    Widget::mybutton = new QPushButton(this);
    mybutton->setText("你好世界");
    connect(mybutton, &QPushButton::clicked, this, &Widget::HandleClick2);

    //通过图形化的界面来控制输入框的位置
    ui->lineEdit->move(100, 100);

    //QLineEdit的父元素/父控件/父窗口就是QWidget
    //通过代码的方式来控制输入框的位置
    QLineEdit* qLineEdit= new QLineEdit(this);

    qLineEdit->setText("老头环");
    qLineEdit->move(500, 500);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::HandleClick1()
{
    //ui->myPushButton:访问到 form file(ui文件)中创建的控件
    //在 QtDesigner中创建一个控件的时候此时就会给这个控件分配一个objectName属性这个属性的值(相等于对某一个控件的唯一标识)
    //会自动生成, 也可以手动修改成别的(我这里将默认的pushButton改成了myPushButton),要求是在界面中得是唯一的(不能和别人重复)
    //qmake在预处理.ui文件的时候，就会根据这里的objectName生成对应的C++代码
    //C++代码中该QPushButton对象的变量名字就是这里的objectName.这个变量就是ui属性中的成员变量
    if (ui->myPushButton->text() == QString("Hello world")) {
        ui->myPushButton->setText("Hello qing");
    }
    else {
        ui->myPushButton->setText("Hello world");
    }

    //此时按钮对象，不需要咱们自己new.new对象的操作已经是被Qt自动生成了
    //而且这个按钮对象，已经作为ui对象里的一个成员变量了.也无需作为Widget的成员，


}

void Widget::HandleClick2() {
    if (mybutton->text() == QString("你好世界")) {
        mybutton->setText("你好qt");
    }
    else {
        mybutton->setText("你好世界");
    }
}

//实际开发中，是通过代码的方式构造界面为主，还是通过图形化界面的方式构造界面为主?
//这两种，都很主要，难分主次
//如果你当前程序界面，界面内容是比较固定的，此时就会以图形化的方式来构造界面
//但是如果你的程序界面，经常要动态变化,此时就会以代码的方式来构造界面
